package br.com.sovi.gwt.server.service.cerca;

import java.util.ArrayList;
import java.util.List;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import br.com.sovi.gwt.client.cercaeletronica.service.CercaService;
import br.com.sovi.gwt.client.entity.Ponto;
import br.com.sovi.gwt.client.entity.cerca.Cerca;
import br.com.sovi.gwt.server.Constants;
import br.com.sovi.gwt.server.json.entity.CercaVO;
import br.com.sovi.gwt.server.json.entity.DispositivoVO;
import br.com.sovi.gwt.server.json.entity.PontoVO;
import br.com.sovi.gwt.server.rest.RestController;
import br.com.sovi.gwt.server.service.CurrentUsuario;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.sun.jersey.api.client.GenericType;

@SuppressWarnings("serial")
public class CercaServiceImpl extends RemoteServiceServlet implements CercaService {

	@Override
	public List<Cerca> getAllDispositivos() {
		List<DispositivoVO> allFromEmpresa = allFromEmpresa();

		List<Cerca> cercas = new ArrayList<Cerca>();

		for (DispositivoVO vo : allFromEmpresa) {
			cercas.add(new Cerca(vo.getSerial(), null));
		}

		return cercas;
	}

	private List<DispositivoVO> allFromEmpresa() {
		try {
			String url = Constants.BASE_URL + "/dispositivo/allByEmpresa?codigoEmpresa="
					+ CurrentUsuario.getCurrent().getCodigoEmpresa();
			List<DispositivoVO> vos = (List<DispositivoVO>) RestController.get(url,
					new GenericType<List<DispositivoVO>>() {
					});

			return vos;
		}
		catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public List<Ponto> getPontosFromCerca(Cerca cerca) {
		String url = Constants.BASE_URL + "/cerca/getPontosFromCerca?serial=" + cerca.getSerial();

		List<PontoVO> vos = (List<PontoVO>) RestController.get(url, new GenericType<List<PontoVO>>() {
		});

		if (vos != null && !vos.isEmpty()) {
			List<Ponto> pontos = new ArrayList<Ponto>(vos.size());

			for (PontoVO pontoVO : vos) {
				pontos.add(pontoVO.toPonto());
			}

			return pontos;
		}
		else {
			return null;
		}
	}

	@Override
	public void persistCerca(Cerca cerca) {
		String url = Constants.BASE_URL + "/cerca/persist";

		JSONObject json = RestController.post(url, new GenericType<JSONObject>() {
		}, new CercaVO(cerca));

		// TODO responder o jsonObject para a interface
	}

	@Override
	public Boolean deleteCercaFromDispositivo(String serial) {
		String url = Constants.BASE_URL + "/cerca/delete";

		JSONObject json = RestController.post(url, new GenericType<JSONObject>() {
		}, serial);

		try {
			if (json.get("success") != null) {
				return true;
			}
		}
		catch (JSONException e) {
		}

		return false;

	}

}
